require "import"
import "android.widget.*"
import "android.view.*"
import "cjson"
import "os"
import "android.widget.PopupMenu"
import "android.content.Context"

local stockApiUrl = "https://financialmodelingprep.com/api/v3/quote/"
local hgUrl       = "https://api.hgbrasil.com/finance"
local cambioUrl   = "https://economia.awesomeapi.com.br/last/"
local bcbSelic    = "https://api.bcb.gov.br/dados/serie/bcdata.sgs.432/dados/ultimos/1?formato=json"
local fmpKey      = "qw9oh3cBMTb5HHoXRraEcLCiRYZP7qL5"
local hgKey       = "e710c5f3"
local oilKey      = "932aa7024f260e3f8d23c548c16389d666a63041cc2399c23635d1fb24f5b359"
local oilBase     = "https://api.oilpriceapi.com/v1/prices/latest"
local oilHeaders  = { ["Authorization"] = "Token " .. oilKey }

local indices = {
    {"SPY",   "S&P 500 - EUA"},
    {"QQQ",   "NASDAQ 100 - EUA"},
    {"DIA",   "Dow Jones - EUA"},
    {"EWJ",   "MSCI Japan - Japao"},
    {"EWH",   "Hang Seng - Hong Kong"},
    {"EWU",   "FTSE 100 - Reino Unido"},
    {"DAX",   "DAX - Alemanha"},
    {"EWG",   "MSCI Germany - Alemanha"},
    {"EWQ",   "CAC 40 - Franca"},
    {"^BVSP", "IBOVESPA - Brasil"},
    {"EWY",   "KOSPI - Coreia do Sul"},
    {"EWA",   "ASX 200 - Australia"},
    {"INDA",  "BSE Sensex - India"},
    {"INDY",  "NIFTY 50 - India"},
    {"EWL",   "SMI - Suica"},
    {"EWC",   "S&P TSX - Canada"},
    {"EWN",   "AEX - Paises Baixos"},
    {"EZA",   "MSCI South Africa - Africa do Sul"},
    {"EWP",   "IBEX 35 - Espanha"},
    {"EWT",   "MSCI Taiwan - Taiwan"},
}

local moedas = {
    "EUR","JPY","GBP","CAD","AUD","CHF","CNY","INR","RUB","MXN",
    "ZAR","KRW","NZD","SGD","USD","TRY","ARS","CLP","COP","THB"
}

local indiceAtual = indices[10]
local moedaAtual  = "EUR"
layoutBolsa, layoutCambio, layoutInd = nil, nil, nil

function fmt(n, casas)
    casas = casas or 2
    local s = string.format("%." .. casas .. "f", n)
    return s:gsub("%.", ",")
end

function irAba(n)
    layoutBolsa.setVisibility(View.GONE)
    layoutCambio.setVisibility(View.GONE)
    layoutInd.setVisibility(View.GONE)
    if n == 1 then
        layoutBolsa.setVisibility(View.VISIBLE)
        service.speak("Pagina Bolsa Facil.")
    elseif n == 2 then
        layoutCambio.setVisibility(View.VISIBLE)
        service.speak("Pagina Cotacao Facil.")
    else
        layoutInd.setVisibility(View.VISIBLE)
        service.speak("Pagina Indicadores Brasileiros.")
    end
end

function utcParaBrasilia(horario)
    if not horario or horario == "?" then return "?" end
    local ano, mes, dia, h, min, seg = horario:match("(%d+)-(%d+)-(%d+)T(%d+):(%d+):(%d+)")
    if not ano then return horario end
    local t = os.time({
        year  = tonumber(ano),
        month = tonumber(mes),
        day   = tonumber(dia),
        hour  = tonumber(h),
        min   = tonumber(min),
        sec   = tonumber(seg),
    })
    return os.date("%d/%m/%Y %H:%M:%S", t - 10800)
end

function extrairOilPrice(json, nome)
    if not json then return nil end
    local ok, d = pcall(cjson.decode, json)
    if not ok or not d or d.status ~= "success" then return nil end
    return {
        preco   = tonumber(d.data.price) or 0,
        horario = utcParaBrasilia(d.data.created_at),
        nome    = nome,
    }
end

function procHG(json)
    local ok, d = pcall(cjson.decode, json)
    if not ok or not d.results then return "Erro ao processar dados do Ibovespa." end
    local r = "IBOVESPA\nResumo do Mercado\n\n"
    if d.results.stocks and d.results.stocks.IBOVESPA then
        local ib = d.results.stocks.IBOVESPA
        r = r .. "Pontos: " .. math.floor(tonumber(ib.points) or 0) .. "\n"
        r = r .. "Variacao: " .. fmt(tonumber(ib.variation) or 0) .. " por cento\n"
    else
        r = r .. "Dados do Ibovespa indisponiveis.\n"
    end
    if d.results.currencies then
        local usd = d.results.currencies.USD
        local eur = d.results.currencies.EUR
        r = r .. "\nMoedas em relacao ao Real:\n\n"
        if usd and usd.buy then
            r = r .. "Dolar americano (USD):\n"
            r = r .. "  Compra:   R$ " .. fmt(tonumber(usd.buy)       or 0) .. "\n"
            r = r .. "  Venda:    R$ " .. fmt(tonumber(usd.sell)      or 0) .. "\n"
            r = r .. "  Variacao: "    .. fmt(tonumber(usd.variation) or 0) .. " por cento\n"
        end
        if eur and eur.buy then
            r = r .. "\nEuro (EUR):\n"
            r = r .. "  Compra:   R$ " .. fmt(tonumber(eur.buy)       or 0) .. "\n"
            r = r .. "  Venda:    R$ " .. fmt(tonumber(eur.sell)      or 0) .. "\n"
            r = r .. "  Variacao: "    .. fmt(tonumber(eur.variation) or 0) .. " por cento\n"
        end
    end
    if d.results.taxes and #d.results.taxes > 0 then
        local t = d.results.taxes[1]
        r = r .. "\nTaxas Brasileiras:\n\n"
        if t.cdi   then r = r .. "CDI:   " .. fmt(tonumber(t.cdi)   or 0) .. " por cento ao ano\n" end
        if t.selic then r = r .. "Selic: " .. fmt(tonumber(t.selic) or 0) .. " por cento ao ano\n" end
    end
    r = r .. "\nAtualizado: " .. os.date("%d/%m/%Y %H:%M:%S") .. "\n"
    return r
end

function procFMP(json, nome)
    local ok, d = pcall(cjson.decode, json)
    if not ok or not d or #d == 0 or not d[1].price then
        return nome .. "\n\nDados nao disponiveis.\n"
    end
    local q = d[1]
    local r = nome .. "\n\n"
    r = r .. "Preco atual: " .. fmt(tonumber(q.price)             or 0) .. "\n"
    r = r .. "Abertura:    " .. fmt(tonumber(q.open)              or 0) .. "\n"
    r = r .. "Maxima:      " .. fmt(tonumber(q.dayHigh)           or 0) .. "\n"
    r = r .. "Minima:      " .. fmt(tonumber(q.dayLow)            or 0) .. "\n"
    r = r .. "Variacao:    " .. fmt(tonumber(q.change)            or 0)
                              .. "  (" .. fmt(tonumber(q.changesPercentage) or 0) .. " por cento)\n"
    r = r .. "Volume:      " .. tostring(q.volume or "N/A") .. "\n"
    r = r .. "\nAtualizado: " .. os.date("%d/%m/%Y %H:%M:%S", q.timestamp or os.time()) .. "\n"
    return r
end

function procCambio(json, orig, qtd)
    local ok, d = pcall(cjson.decode, json)
    if not ok then return "Erro ao processar cotacao de " .. orig .. "." end
    local k = orig .. "BRL"
    if not d[k] then return orig .. " para Real Brasileiro\n\nDados nao encontrados.\n" end
    local c      = d[k]
    local compra = tonumber(c.bid) or 0
    local r = orig .. " para Real Brasileiro\n\n"
    r = r .. orig .. " " .. tostring(qtd) .. " equivale a R$ " .. fmt(compra * qtd) .. "\n\n"
    r = r .. "Cotacao de compra:  R$ " .. fmt(compra)                  .. "\n"
    r = r .. "Cotacao de venda:   R$ " .. fmt(tonumber(c.ask)       or 0) .. "\n"
    r = r .. "Maxima do dia:      R$ " .. fmt(tonumber(c.high)       or 0) .. "\n"
    r = r .. "Minima do dia:      R$ " .. fmt(tonumber(c.low)        or 0) .. "\n"
    r = r .. "Variacao:           "    .. fmt(tonumber(c.pctChange)  or 0) .. " por cento\n"
    r = r .. "\nAtualizado: " .. (c.create_date or "?") .. "\n"
    return r
end

function consultarIndicadores()
    btnInd.setEnabled(false)
    txtInd.setText("Consultando indicadores, aguarde...")
    service.speak("Consultando indicadores brasileiros...")
    local dSelic, dHG = nil, nil
    local conta = 0
    local function montar()
        conta = conta + 1
        if conta < 2 then return end
        btnInd.setEnabled(true)
        local r = "Indicadores Economicos Brasileiros\n\n"
        r = r .. os.date("Consulta: %d/%m/%Y %H:%M:%S\n\n")
        r = r .. "SELIC pelo Banco Central do Brasil:\n\n"
        if dSelic then
            local ok, ds = pcall(cjson.decode, dSelic)
            if ok and ds and #ds > 0 then
                r = r .. "Taxa mensal: " .. fmt(tonumber(ds[1].valor) or 0, 4) .. " por cento\n"
                r = r .. "Referencia: " .. (ds[1].data or "?") .. "\n"
                r = r .. "Selic anual vigente: 14,75 por cento ao ano\n"
            else
                r = r .. "Nao foi possivel obter o dado.\n"
            end
        else
            r = r .. "Falha na conexao com o Banco Central.\n"
        end
        if dHG then
            local ok, dh = pcall(cjson.decode, dHG)
            if ok and dh and dh.results then
                if dh.results.taxes and #dh.results.taxes > 0 then
                    local t = dh.results.taxes[1]
                    r = r .. "\nTaxas pelo HG Brasil:\n\n"
                    if t.cdi   then r = r .. "CDI:   " .. fmt(tonumber(t.cdi)   or 0) .. " por cento\n" end
                    if t.selic then r = r .. "Selic: " .. fmt(tonumber(t.selic) or 0) .. " por cento\n" end
                    if t.igpm  then r = r .. "IGP-M: " .. fmt(tonumber(t.igpm)  or 0) .. " por cento\n" end
                end
            else
                r = r .. "\nErro ao processar dados da HG Brasil.\n"
            end
        else
            r = r .. "\nFalha na conexao com HG Brasil.\n"
        end
        txtInd.setText(r)
        service.speak("Indicadores carregados com sucesso.")
    end
    Http.get(bcbSelic, function(st, d)
        if st == 200 then dSelic = d end
        montar()
    end)
    Http.get(hgUrl .. "?key=" .. hgKey, function(st, d)
        if st == 200 then dHG = d end
        montar()
    end)
end

function consultarPetroleo()
    btnPetro.setEnabled(false)
    txtBolsa.setText("Consultando petroleo, aguarde...")
    service.speak("Consultando cotacao do petroleo...")
    local jBrent, jWTI, jGas = nil, nil, nil
    local conta = 0
    local function montar()
        conta = conta + 1
        if conta < 3 then return end
        btnPetro.setEnabled(true)
        local brent = extrairOilPrice(jBrent, "Brent")
        local wti   = extrairOilPrice(jWTI,   "WTI")
        local gas   = extrairOilPrice(jGas,   "Gas Natural")
        local r = "Petroleo e Energia\n\n"
        r = r .. "Petroleo Brent:\n"
        if brent then
            r = r .. "  Preco: US$ " .. fmt(brent.preco) .. " por barril\n"
            r = r .. "  Atualizado: " .. brent.horario .. " (horario de Brasilia)\n"
        else
            r = r .. "  Dados nao disponiveis.\n"
        end
        r = r .. "\nPetroleo WTI:\n"
        if wti then
            r = r .. "  Preco: US$ " .. fmt(wti.preco) .. " por barril\n"
            r = r .. "  Atualizado: " .. wti.horario .. " (horario de Brasilia)\n"
        else
            r = r .. "  Dados nao disponiveis.\n"
        end
        r = r .. "\nGas Natural:\n"
        if gas then
            r = r .. "  Preco: US$ " .. fmt(gas.preco) .. " por MMBtu\n"
            r = r .. "  Atualizado: " .. gas.horario .. " (horario de Brasilia)\n"
        else
            r = r .. "  Dados nao disponiveis.\n"
        end
        r = r .. "\nFonte: OilPriceAPI (atualizado a cada 5 minutos)\n"
        r = r .. "Consulta feita em: " .. os.date("%d/%m/%Y %H:%M:%S") .. "\n"
        txtBolsa.setText(r)
        service.speak("Cotacao do petroleo e gas natural obtida.")
    end
    Http.get(oilBase .. "?by_code=BRENT_CRUDE_USD", oilHeaders, function(st, d)
        if st == 200 then jBrent = d end
        montar()
    end)
    Http.get(oilBase .. "?by_code=WTI_USD", oilHeaders, function(st, d)
        if st == 200 then jWTI = d end
        montar()
    end)
    Http.get(oilBase .. "?by_code=NATURAL_GAS_USD", oilHeaders, function(st, d)
        if st == 200 then jGas = d end
        montar()
    end)
end

function consultarIbov()
    btnIbov.setEnabled(false)
    btnConsIdx.setEnabled(false)
    txtBolsa.setText("Consultando Ibovespa, aguarde...")
    service.speak("Consultando Ibovespa...")
    Http.get(hgUrl .. "?key=" .. hgKey, function(st, dados)
        btnIbov.setEnabled(true)
        btnConsIdx.setEnabled(true)
        if st == 200 and dados then
            txtBolsa.setText(procHG(dados))
            service.speak("Ibovespa obtido com sucesso.")
        else
            txtBolsa.setText("Erro ao conectar. Status: " .. tostring(st))
            service.speak("Erro ao conectar.")
        end
    end)
end

function consultarIndice()
    local sel = indiceAtual
    btnIbov.setEnabled(false)
    btnConsIdx.setEnabled(false)
    txtBolsa.setText("Consultando " .. sel[2] .. ", aguarde...")
    service.speak("Consultando " .. sel[2])
    local url
    if sel[2]:find("IBOVESPA") then
        url = hgUrl .. "?key=" .. hgKey
    else
        url = stockApiUrl .. sel[1] .. "?apikey=" .. fmpKey
    end
    Http.get(url, function(st, dados)
        btnIbov.setEnabled(true)
        btnConsIdx.setEnabled(true)
        if st == 200 and dados then
            if sel[2]:find("IBOVESPA") then
                txtBolsa.setText(procHG(dados))
            else
                txtBolsa.setText(procFMP(dados, sel[2]))
            end
            service.speak("Dados de " .. sel[2] .. " obtidos.")
        else
            txtBolsa.setText("Erro ao conectar. Status: " .. tostring(st))
            service.speak("Erro ao conectar.")
        end
    end)
end

function abrirMenuIndices(v)
    local m = PopupMenu(v.getContext(), v)
    for _, idx in ipairs(indices) do
        m.getMenu().add(idx[2])
    end
    m.setOnMenuItemClickListener({
        onMenuItemClick = function(item)
            local nome = item.getTitle()
            for _, idx in ipairs(indices) do
                if idx[2] == nome then indiceAtual = idx; break end
            end
            btnIdxSel.setText("Indice selecionado: " .. nome)
            service.speak("Indice selecionado: " .. nome)
            return true
        end
    })
    m.show()
end

function abrirMenuMoedas(v)
    local m = PopupMenu(v.getContext(), v)
    for _, mo in ipairs(moedas) do
        m.getMenu().add(mo)
    end
    m.setOnMenuItemClickListener({
        onMenuItemClick = function(item)
            moedaAtual = item.getTitle()
            btnMoeda.setText("Moeda selecionada: " .. moedaAtual)
            service.speak("Moeda selecionada: " .. moedaAtual)
            return true
        end
    })
    m.show()
end

function consultarUSD()
    btnUSD.setEnabled(false)
    btnVerCot.setEnabled(false)
    txtCambio.setText("Consultando USD, aguarde...")
    service.speak("Consultando dolar americano...")
    Http.get(cambioUrl .. "USD-BRL", function(st, dados)
        btnUSD.setEnabled(true)
        btnVerCot.setEnabled(true)
        if st == 200 and dados then
            local qtd = tonumber(editQtd.getText().toString()) or 1
            txtCambio.setText(procCambio(dados, "USD", qtd))
            moedaAtual = "USD"
            btnMoeda.setText("Moeda selecionada: USD")
            service.speak("Cotacao do dolar obtida.")
        else
            txtCambio.setText("Erro ao conectar. Status: " .. tostring(st))
            service.speak("Erro ao conectar.")
        end
    end)
end

function consultarMoeda(v)
    local m = moedaAtual
    btnUSD.setEnabled(false)
    btnVerCot.setEnabled(false)
    txtCambio.setText("Consultando " .. m .. ", aguarde...")
    service.speak("Consultando " .. m)
    local imm = v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE)
    imm.hideSoftInputFromWindow(v.getWindowToken(), 0)
    Http.get(cambioUrl .. m .. "-BRL", function(st, dados)
        btnUSD.setEnabled(true)
        btnVerCot.setEnabled(true)
        if st == 200 and dados then
            local qtd = tonumber(editQtd.getText().toString()) or 1
            txtCambio.setText(procCambio(dados, m, qtd))
            service.speak("Cotacao de " .. m .. " obtida.")
        else
            txtCambio.setText("Erro ao conectar. Status: " .. tostring(st))
            service.speak("Erro ao conectar.")
        end
    end)
end

-- LAYOUTS
local lBolsa = {
    LinearLayout, orientation="vertical",
    layout_width="match_parent", layout_height="match_parent",
    backgroundColor="#000000", padding="10dp", id="layoutBolsa",
    { ScrollView, layout_width="match_parent", layout_height="0dp", layout_weight="1",
        { LinearLayout, orientation="vertical", layout_width="match_parent", layout_height="wrap_content",
            { TextView, id="txtBolsa", layout_width="match_parent", layout_height="wrap_content",
              text="Bem-vindo ao Bolsa Facil.\nConsulte o Ibovespa ou selecione um indice.",
              textSize="16sp", textColor="#ffffff", padding="10dp" },
        },
    },
    { Button, text="Consultar Ibovespa", id="btnIbov",
      textColor="#ffffff", backgroundColor="#00AA00",
      layout_width="match_parent", layout_height="wrap_content", layout_marginBottom="6dp",
      onClick=function() consultarIbov() end },
    { Button, text="Consultar petroleo e gas natural", id="btnPetro",
      textColor="#ffffff", backgroundColor="#AA6600",
      layout_width="match_parent", layout_height="wrap_content", layout_marginBottom="6dp",
      onClick=function() consultarPetroleo() end },
    { Button, id="btnIdxSel", text="Indice selecionado: IBOVESPA - Brasil",
      textColor="#ffffff", backgroundColor="#555555",
      layout_width="match_parent", layout_height="wrap_content", layout_marginBottom="6dp",
      onClick=function(v) abrirMenuIndices(v) end },
    { Button, text="Consultar indice selecionado", id="btnConsIdx",
      textColor="#ffffff", backgroundColor="#0066AA",
      layout_width="match_parent", layout_height="wrap_content", layout_marginBottom="6dp",
      onClick=function() consultarIndice() end },
    { Button, text="Ir para Cotacao Facil", textColor="#ffffff", backgroundColor="#880088",
      layout_width="match_parent", layout_height="wrap_content", layout_marginBottom="4dp",
      onClick=function() irAba(2) end },
    { Button, text="Ir para Indicadores Brasileiros", textColor="#ffffff", backgroundColor="#006688",
      layout_width="match_parent", layout_height="wrap_content", layout_marginBottom="4dp",
      onClick=function() irAba(3) end },
    { Button, text="Fechar aplicativo", backgroundColor="#AA0000", textColor="#ffffff",
      layout_width="match_parent", layout_height="wrap_content", layout_marginBottom="4dp",
      onClick=function() dlg.dismiss() end },
}

local lCambio = {
    LinearLayout, orientation="vertical",
    layout_width="match_parent", layout_height="match_parent",
    backgroundColor="#000000", padding="10dp", id="layoutCambio", visibility="gone",
    { ScrollView, layout_width="match_parent", layout_height="0dp", layout_weight="1",
        { LinearLayout, orientation="vertical", layout_width="match_parent", layout_height="wrap_content",
            { TextView, id="txtCambio", layout_width="match_parent", layout_height="wrap_content",
              text="Bem-vindo ao Cotacao Facil.\nSelecione uma moeda e clique em Ver cotacao.",
              textSize="16sp", textColor="#ffffff", padding="10dp" },
        },
    },
    { Button, text="Consultar dolar americano (USD)", id="btnUSD",
      textColor="#ffffff", backgroundColor="#00AA00",
      layout_width="match_parent", layout_height="wrap_content", layout_marginBottom="6dp",
      onClick=function() consultarUSD() end },
    { Button, id="btnMoeda", text="Moeda selecionada: EUR",
      textColor="#ffffff", backgroundColor="#555555",
      layout_width="match_parent", layout_height="wrap_content", layout_marginBottom="6dp",
      onClick=function(v) abrirMenuMoedas(v) end },
    { EditText, id="editQtd", hint="Quantidade (ex: 100)",
      textColor="#ffffff", hintTextColor="#888888",
      layout_width="match_parent", layout_height="wrap_content", layout_marginBottom="6dp",
      inputType="numberDecimal" },
    { Button, text="Ver cotacao da moeda selecionada", id="btnVerCot",
      textColor="#ffffff", backgroundColor="#0066AA",
      layout_width="match_parent", layout_height="wrap_content", layout_marginBottom="6dp",
      onClick=function(v) consultarMoeda(v) end },
    { Button, text="Ir para Bolsa Facil", textColor="#ffffff", backgroundColor="#880088",
      layout_width="match_parent", layout_height="wrap_content", layout_marginBottom="4dp",
      onClick=function() irAba(1) end },
    { Button, text="Ir para Indicadores Brasileiros", textColor="#ffffff", backgroundColor="#006688",
      layout_width="match_parent", layout_height="wrap_content", layout_marginBottom="4dp",
      onClick=function() irAba(3) end },
    { Button, text="Fechar aplicativo", backgroundColor="#AA0000", textColor="#ffffff",
      layout_width="match_parent", layout_height="wrap_content", layout_marginBottom="4dp",
      onClick=function() dlg.dismiss() end },
}

local lInd = {
    LinearLayout, orientation="vertical",
    layout_width="match_parent", layout_height="match_parent",
    backgroundColor="#000000", padding="10dp", id="layoutInd", visibility="gone",
    { ScrollView, layout_width="match_parent", layout_height="0dp", layout_weight="1",
        { LinearLayout, orientation="vertical", layout_width="match_parent", layout_height="wrap_content",
            { TextView, id="txtInd", layout_width="match_parent", layout_height="wrap_content",
              text="Clique em Consultar indicadores para ver SELIC, CDI e IGP-M.",
              textSize="16sp", textColor="#ffffff", padding="10dp" },
        },
    },
    { Button, text="Consultar indicadores", id="btnInd",
      textColor="#ffffff", backgroundColor="#006688",
      layout_width="match_parent", layout_height="wrap_content", layout_marginBottom="6dp",
      onClick=function() consultarIndicadores() end },
    { Button, text="Ir para Bolsa Facil", textColor="#ffffff", backgroundColor="#880088",
      layout_width="match_parent", layout_height="wrap_content", layout_marginBottom="4dp",
      onClick=function() irAba(1) end },
    { Button, text="Ir para Cotacao Facil", textColor="#ffffff", backgroundColor="#006688",
      layout_width="match_parent", layout_height="wrap_content", layout_marginBottom="4dp",
      onClick=function() irAba(2) end },
    { Button, text="Fechar aplicativo", backgroundColor="#AA0000", textColor="#ffffff",
      layout_width="match_parent", layout_height="wrap_content", layout_marginBottom="4dp",
      onClick=function() dlg.dismiss() end },
}

mainLayout = {
    LinearLayout, orientation="vertical",
    layout_width="match_parent", layout_height="match_parent",
    lBolsa, lCambio, lInd,
}

local todosBotoes = {
    "btnIbov", "btnPetro", "btnIdxSel", "btnConsIdx",
    "btnUSD", "btnMoeda", "btnVerCot", "btnInd",
}

local function desativarMaiusculas()
    for _, nome in ipairs(todosBotoes) do
        local btn = _G[nome]
        if btn then btn.setTransformationMethod(nil) end
    end
end

dlg = LuaDialog()
dlg.setTitle("Bolsa e Cotacao Facil - Marcos Souza")
local v = loadlayout(mainLayout)
layoutBolsa  = _G["layoutBolsa"]
layoutCambio = _G["layoutCambio"]
layoutInd    = _G["layoutInd"]
desativarMaiusculas()
dlg.setView(v)
dlg.show()
service.speak("Bem-vindo ao Bolsa e Cotacao Facil. Voce esta na pagina Bolsa Facil. Navegue pelos botoes para consultar indices, petroleo ou ir para outras paginas.")